#!/usr/bin/python
#coding:utf-8
'''
KNN(k-Nearest Neighbor):k近邻算法
'''
import numpy as np 
from sklearn import neighbors,datasets,model_selection

#构建数据集
dataMat = datasets.load_iris()

x=dataMat.data
y=dataMat.target

x_train,x_test,y_train,y_test = model_selection.train_test_split(x,y,test_size=0.25)
'''
n_neighbors: 默认5，使用默认方法neighbors
weights:默认uniform，有三个选择
    uniform：每个邻域的所有点加权相等
    distance：数据重要程度与距离成反比。这种情况下，查询点近邻点比远数据有更大的影响。
    callable：用户定义函数，接收一个数组的距离，并返回一个相同形状的数组。
algorithm:选择近邻算法：auto(默认)、ball_tree、kd_tree、brute
    auto:自动匹配合适的算法
    ball_tree: 使用BallTree
    kd_tree:使用KDTree
    brute:使用brute-force 查询
leaf_size:默认30，定义叶片大小，通过BallTree和DKTree。这会影响内存树的构造速度和查询性能
p:默认2。闵可夫斯基度量的功率参数，当为1时，使用manbattan_distance(L1)，但为2时，euclidean_distance(L2)。当为其他任意值时：minkowski_distance（l_p）
metric:默认minkowski。用于树的度量距离，默认minkowski和p=2是标准的欧几里得度量，其他值查询度量列表
metric_params:默认None，额外的metirc的度量函数
n_jobs:并行数，默认1.   -1：和CPU核数一致  1
'''
knn=neighbors.KNeighborsClassifier(n_neighbors=2)
knn.fit(x_train,y_train)

result=knn.score(x_test,y_test)
print "SuccessResult:",result
result = knn.predict([[3,2,2,5]])
print dataMat.target_names[result]